package com.king.designpatterns.hybriddesignpattern.hybriddesignpattern.specificationpattern;

import java.util.ArrayList;

/**
 * 规格模式已经是一个非常具体的应用框架，它巧妙地实现了对象的筛选功能，当遇到下面所述的情况时，可以考虑使用规格模式。
 *      ■ 从多个对象中筛选查找符合不同条件的对象。
 *      ■ 业务规则不适于放在任何已有的实体或值对象中，且规则的变化和组合会掩盖领域对象的基本含义。
 *
 * @author king
 * @date 2021-06-16 16:44
 */
public class Client {
    public static void main(String[] args) {
        // 初始化用户列表
        ArrayList<User> users = new ArrayList<>();
        users.add(new User("张三", 23));
        users.add(new User("李四", 61));
        users.add(new User("王五", 65));
        users.add(new User("张丽", 35));
        users.add(new User("李鹏", 72));
        users.add(new User("王艳", 18));
        users.add(new User("王小二", 14));
        users.add(new User("李章", 32));

        // 定义一个用户查询类
        IUserProvider userProvider = new UserProvider(users);
        // 打印姓”张“的用户
        System.out.println("=====姓张的用户=====");
        for (User u : userProvider.findUser(new UserByNameLike("张%"))){
            u.show();
        }

        // 打印年龄大于60的用户
        System.out.println("=====年龄大于60的用户=====");
        for (User u : userProvider.findUser(new UserByAgeThan(60))){
            u.show();
        }

        // 打印名字中包含”张“的且年龄大于30的用户
        System.out.println("=====名字中包含”张“的且年龄大于30的用户=====");
        IUserSpecification spec1 = new UserByNameLike("%张%");
        IUserSpecification spec2 = new UserByAgeThan(30);
        for (User u : userProvider.findUser(spec1.and(spec2))){
            u.show();
        }

        // 打印年龄小于20的用户
        System.out.println("=====年龄小于20的用户=====");
        IUserSpecification spec3 = new UserByAgeThan(20);
        for (User u : userProvider.findUser(spec3.not())){
            u.show();
        }
    }
}
